#include "stdafx.h"
#include "bitmap.h"
#include "sdlException.h"


bitmap::bitmap(SDL_Surface* surface) {
	if (surface == NULL) {
		std::string error = "bitmap::Constructor - Surface es null en constructor de bitmap";
		throw new sdlException(error);
	}

	this->image = surface;
}


bitmap::bitmap(std::string pathToImage) {
	SDL_Surface *temp;

	temp = sdlHelper::loadBMP(pathToImage.c_str());
	
	//mantengo una referencia a la imagen. veamos si esto garpa, sino se saca
	this->image = SDL_DisplayFormat(temp);
	
	//libero los recursos
	SDL_FreeSurface(temp);

}

bitmap::~bitmap() { 
	//libero recursos de la imagen
	SDL_FreeSurface(this->image);

}

void bitmap::mostrar(SDL_Surface* screen){
	//copia la imagen con las medidas
	sdlHelper::blitSurface(this->image, NULL, screen, NULL);

	//cambio del buffer de atras de screen, al buffer que se ve de screen
	sdlHelper::flip(screen);
}

void bitmap::mostrar(SDL_Surface* screen, SDL_Rect* tamanio, SDL_Rect* dest){
	//copia la imagen con las medidas
	sdlHelper::blitSurface(this->image, tamanio, screen, dest);

	//cambio del buffer de atras de screen, al buffer que se ve de screen
	sdlHelper::flip(screen);

}

SDL_Surface* bitmap::getImage() {
	return this->image;
}

void bitmap::modificarImagen(Uint16 wid, Uint16 hei) {

    if(!wid || !hei) {
        throw new sdlException("bitmap::modificarImagen - Malos parametros");
	}

	SDL_Surface* s = this->getImage();
   
    SDL_Surface *ret = SDL_CreateRGBSurface(s->flags, wid, hei, s->format->BitsPerPixel,
        s->format->Rmask, s->format->Gmask, s->format->Bmask, s->format->Amask);

    double  _stretch_factor_x = (static_cast<double>(wid)  / static_cast<double>(s->w)),
        _stretch_factor_y = (static_cast<double>(hei) / static_cast<double>(s->h));

    for(Sint32 y = 0; y < s->h; y++)
        for(Sint32 x = 0; x < s->w; x++)
            for(Sint32 o_y = 0; o_y < _stretch_factor_y; ++o_y)
                for(Sint32 o_x = 0; o_x < _stretch_factor_x; ++o_x)
					punto::ponerUnPixel(ret, static_cast<Sint32>(_stretch_factor_x * x) + o_x,
					static_cast<Sint32>(_stretch_factor_y * y) + o_y, punto::getPixel(s, x, y));


	//libero la imagen anterior
    SDL_FreeSurface(this->image);
	//asigno la nueva imagen "modificada"
	this->image = ret;
};


